package com.loeng.module.system.service.user;

import com.loeng.framework.common.pojo.PageResult;
import com.loeng.framework.common.util.object.BeanUtils;
import com.loeng.module.system.controller.admin.user.vo.UsersPageReqVO;
import com.loeng.module.system.controller.admin.user.vo.UsersSaveReqVO;
import com.loeng.module.system.dal.dataobject.user.AdminUserDO;
import com.loeng.module.system.dal.mysql.user.AdminUserMapper;
import com.loeng.module.system.enums.ErrorCodeConstants;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

import static com.loeng.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * 管理后台 - 用户 Service 实现类
 * @author loeng zhuo
 */
@Service
public class AdminUserServiceImpl implements AdminUserService {

    @Resource
    private AdminUserMapper userMapper;
    @Resource
    private PasswordEncoder passwordEncoder;

    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户
     */
    @Override
    public AdminUserDO getUserByUsername(String username) {
        return userMapper.getUserByUsername(username);
    }

    /**
     * 验证密码是否匹配
     * @param dataBasePassword 数据库密码
     * @param formPassword 表单密码
     * @return 是否匹配
     */
    @Override
    public boolean isPasswordMatch(String dataBasePassword, String formPassword) {
        return passwordEncoder.matches(formPassword, dataBasePassword);
    }

    /**
     * 根据用户ID查询用户
     * @param userId 用户ID
     * @return 用户
     */
    @Override
    public AdminUserDO getUserByUserId(Long userId) {
        return userMapper.selectById(userId);
    }

    /**
     * 通过用户 ID 查询用户
     *
     * @param loginUserId 用户ID
     * @return 用户对象信息
     */
    @Override
    public AdminUserDO getUser(Long loginUserId) {
        return userMapper.selectById(loginUserId);
    }

    /**
     * 更新用户登录信息
     *
     * @param userId 用户ID
     * @param loginIp 登录IP
     */
    @Override
    public void updateUserLogin(Long userId, String loginIp) {
        userMapper.updateById(new AdminUserDO()
                .setId(userId).setLoginIp(loginIp)
                .setLoginDate(LocalDateTime.now()));
    }

    @Override
    public Long createUsers(UsersSaveReqVO createReqVO) {
        // 插入
        AdminUserDO users = BeanUtils.toBean(createReqVO, AdminUserDO.class);
        userMapper.insert(users);
        // 返回
        return users.getId();
    }

    @Override
    public void updateUsers(UsersSaveReqVO updateReqVO) {
        // 校验存在
        validateUsersExists(updateReqVO.getId());
        // 更新
        AdminUserDO updateObj = BeanUtils.toBean(updateReqVO, AdminUserDO.class);
        userMapper.updateById(updateObj);
    }

    @Override
    public void deleteUsers(Long id) {
        // 校验存在
        validateUsersExists(id);
        // 删除
        userMapper.deleteById(id);
    }

    private void validateUsersExists(Long id) {
        if (userMapper.selectById(id) == null) {
            throw exception(ErrorCodeConstants.USERS_NOT_EXISTS);
        }
    }

    @Override
    public AdminUserDO getUsers(Long id) {
        return userMapper.selectById(id);
    }

    @Override
    public PageResult<AdminUserDO> getUsersPage(UsersPageReqVO pageReqVO) {
        return userMapper.selectPage(pageReqVO);
    }

    /**
     * 获得用户精简信息列表
     *
     * @param status 状态
     * @return 用户精简信息列表
     */
    @Override
    public List<AdminUserDO> getUserListByStatus(Integer status) {
        return userMapper.selectListByStatus(status);
    }

}
